#include<cstdio>
#include<cstring>
const int N=20;
typedef long long ll;
int map[N][N],n,m,u,v;
ll dp[1<<N][N];
int first(int x)
{
    for(int i=0;i<n;i++) if(x&(1<<i)) return i;
}
 
int cnt(int x)
{
    int ans=0;
    for(int i=0;i<n;i++) if(x&(1<<i)) ans++;
    return ans;
}
 
int main()
{
    //freopen("4.in","r",stdin);
    while(scanf("%d",&n)!=EOF) {
        memset(map,0,sizeof(map));
        memset(dp,0,sizeof(dp));
        int a,b,c;
        for(int i=0;i<n;i++){
            scanf("%d%d%d",&a,&b,&c);
            map[i][a-1]=map[a-1][i]=1;
            map[i][b-1]=map[b-1][i]=1;
            map[i][c-1]=map[c-1][i]=1;
        }
        // for(int i=0;i<m;i++) {
        //     scanf("%d%d",&u,&v);
        //     u--,v--;
        //     map[u][v]=map[v][u]=1;
        // }
        ll ans=0;
        for(int i=0;i<N;i++) dp[1<<i][i]=1;
        for(int st=1;st<(1<<n);st++) {
            int s=first(st);
            for(int e=s;e<n;e++) {
                if(st&(1<<e)) {
                    for(int i=s;i<n;i++) {
                        int nst=st|(1<<i);
                        if(map[e][i] && (st&(1<<i))==0) {
                            dp[nst][i]+=dp[st][e];
                            if(map[i][s] && cnt(nst)>2) ans+=dp[st][e];//如果可首尾相连且长度大于3则计数
                        }
                    }
                }
            }
        }
        printf("%lld\n",ans/2);
    }
    return 0;
}
